#include <vector>

using namespace std;


class Solution {
public:
    //* 滑动窗口解法 O(n)
    //* 每一轮迭代，将 nums[r] 加到当前总和，如果当前总和大于 target，
    //* 则更新子数组的最小长度，然后将 nums[l] 从当前总和中减去并且右移 l，
    //* 直到当前总和小于 target，在此过程中同样更新子数组的最小长度。在每
    //* 一轮迭代的最后，将 r 右移。
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size();
        int l = 0, r = 0;

        int curr = 0;
        int min_len = n+1;
        while (r<n) {  // 可改为 for loop
            curr += nums[r];
            while (curr >= target) {
                min_len = min(min_len, r-l+1);
                curr -= nums[l++];  // 移动左侧
            }
            r++;
        }

        return min_len < n+1 ? min_len : 0;
    }
};
